# 这些代码的作用是：把GroundTruth模型的数据，与其他所有模型的数据，逐cell比较，得到每张图像*每个指标下，GroundTruth模型结果的排名
# 1. 将所有的数据加载
# 2. 逐Cell保存，以map

# 设置一下数据的路径，以及要查看的模型名
data_path = "../data"
targetModel = "GroundTruth.json"
resultPath = "result.xlsx"

metrics = ['sen', 'me', 'mse(small)', 'avg', 'std', 'vifp', 'snr', 'min', 'uqi', 'qabf', 'vif', 'ssim', 'psnr', 'ifc', 'q0i', 'ce(small)', 'edge', 'qcv(small)', 'sf', 'qcb']

import json,os,openpyxl

def load_data(dir):
    "本函数加载dir下的所有json文件"
    fnames = os.listdir(dir)        # 获取所有文件名
    
    data = [[[]for j in range(20)]for i in range(115)]    # 添加一个115*20的容器
    for fN in fnames:
        # 打开每个模型的json文件
        with open(os.path.join(dir,fN),"r",encoding="utf8") as f:
            aTb = json.loads(f.read())
        # 加载一个json文件中的数据
        for i,row in enumerate(aTb):
            for j,v in enumerate(row.values()):
                data[i][j].append((v,fN))
    return data


def writeXlsx(sheetData, result_path):
    "将表单数据写到path文件中"
    new_wb = openpyxl.Workbook()  # 创建新表
    new_sheet = new_wb.create_sheet(title="figureData")
    # 添加到表中
    for row in sheetData:
        new_sheet.append(row)  # 首先插入第一行列名，横坐标
    new_wb.save(result_path)  # 写入,保存为模型名
    print("%s保存成功！" % result_path)

def getCellRank():
    # 获得115*20的小格子，每个格子里有35个数据
    data = load_data(data_path)
    # 下面都是自动执行的
    table = [[] for i in range(115)]  # 添加一个115*20的容器
    for i in range(len(data)):
        for j in range(len(data[i])):
            data[i][j].sort(key=lambda x: -x[0] if 'small' not in metrics[j] else x[0])
            cellRank = [t[1] for t in data[i][j]]
            table[i].append(1 + cellRank.index(targetModel))

    table.insert(0,metrics)
    writeXlsx(table, resultPath)

if __name__ == '__main__':
    getCellRank()
    print("OK")